package org.mspring.platform.dao.hibernate;

import java.io.Serializable;
import java.util.List;
import org.hibernate.criterion.DetachedCriteria;
import org.mspring.platform.dao.DAOException;
import org.mspring.platform.dao.Page;
import org.mspring.platform.dao.hibernate.common.CriteriaQuery;
import org.mspring.platform.dao.hibernate.common.EnhancedRule;
import org.mspring.platform.dao.query.QueryBuilder;

/**
 *
 * @author Gao Youbo
 * @param <T>
 * @param <PK>
 * @since 2013-6-20
 */
@SuppressWarnings("unchecked")
public abstract interface IGenericDao<T, PK extends Serializable> {

    /**
     * 获取所有
     *
     * @return
     */
    List<T> listAll();

    /**
     * 根据ID获取对象
     *
     * @param id
     * @return
     */
    T get(PK id);

    /**
     * 根据属性值查找对象
     *
     * @param property
     *            属性名称
     * @param value
     *            属性值
     * @return
     */
    T getBy(String property, Object value);

    /**
     * 删除对象
     *
     * @param entity
     *            被删除的对象
     * @throws DAOException
     */
    void delete(T entity) throws DAOException;

    /**
     * 根据ID批量删除
     *
     * @param id
     */
    void delete(PK... id);

    /**
     * 更新对象，如果对象不存在就保存
     *
     * @param entity
     *            被更新的对象
     */
    void update(T entity);

    /**
     * 根据HQL进行查询，返回多个对象
     *
     * @param hql
     * @param params
     * @return List
     * @throws DAOException
     */
    List<T> list(String hql, Object... params) throws DAOException;

    /**
     * 根据QueryBuilder查找
     *
     * @param queryBuilder
     * @return
     */
    List<T> list(QueryBuilder queryBuilder);

    /**
     * 根据增强规则查找
     *
     * @param enhancedRule
     * @return
     */
    List<T> list(EnhancedRule enhancedRule);

    /**
     * 根据高级条件进行查询
     *
     * @param criteriaQuery
     * @return
     */
    List<T> list(CriteriaQuery criteriaQuery);

    /**
     *
     * @param detachedCriteria
     * @return
     */
    List<T> list(DetachedCriteria detachedCriteria);

    /**
     *
     * @param detachedCriteria
     * @param firstResult
     * @param maxResults
     * @return
     */
    List<T> list(DetachedCriteria detachedCriteria, int firstResult, int maxResults);

    /**
     * 根据HQL进行更新操作
     *
     * @param hql
     * @param params
     * @return int
     * @throws DAOException
     */
    int executeUpdate(String hql, Object... params) throws DAOException;

    /**
     * 根据HQL进行查询，返回单个对象
     *
     * @param hql
     * @param params
     * @return T
     * @throws DAOException
     */
    T uniqueResult(String hql, Object... params) throws DAOException;

    /**
     * 分页查找
     *
     * @param queryBuilder
     * @param page
     * @return
     */
    Page<T> listPage(QueryBuilder queryBuilder, Page<T> page);

    /**
     * 分页查找
     *
     * @param hql
     * @param page
     * @param params
     * @return
     */
    Page<T> listPage(String hql, Page<T> page, Object... params);

    /**
     * 分页查找
     *
     * @param criteriaQuery
     * @param page
     * @return
     */
    Page<T> listPage(CriteriaQuery criteriaQuery, Page<T> page);

    /**
     * 合并对象
     *
     * @param entity
     * @return
     */
    T merge(T entity);

    /**
     * 创建对象
     *
     * @param entity
     * @return
     */
    public PK insert(T entity);
}
